package com.wl.myclocksource.lister;

import com.wl.myclocksource.init.PortInit;
import com.wl.myclocksource.utils.SerialPortUtil;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author liwangwang
 * @site Liwangwang321@163.com
 * @create 2020-11-10 13:47
 */
public class MyLister implements SerialPortEventListener {

    private  String str = "";
    private  int strCount = 0;
    private  Pattern pattern= Pattern.compile("\\\\G\\d+");


    @Override
    public void serialEvent(SerialPortEvent arg0) {
        // TODO Auto-generated method stub
        //对以下内容进行判断并操作
        /*
        如果这个不行的话就换这个参考：https://blog.csdn.net/l13020227067/article/details/80693087
        BI -通讯中断
    　　CD -载波检测
    　　CTS -清除发送
    　　DATA_AVAILABLE -有数据到达
    　　DSR -数据设备准备好
    　　FE -帧错误
    　　OE -溢位错误
    　　OUTPUT_BUFFER_EMPTY -输出缓冲区已清空
    　　PE -奇偶校验错
        RI -　振铃指示
        */
        //switch多个，if单个
        if (arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            strCount++;
            SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();
            byte[] bytes = serialPortUtil.readFromPort(PortInit.serialPort);
//            System.out.println(PortInit.serialPort);
            String byteStr = new String(bytes);

            System.out.println("===========start===========");
            System.out.println(new Date() + "【读到的字节数组】：-----" + byteStr);
            String needData = printHexString(bytes);
            System.out.println(new Date() + "【字节数组转字符串】：-----" + needData);
            System.out.println(new Date() +"【16进制字符串转字符串】："+hexStringToString(needData));
            System.out.println("===========end===========");
            str+=byteStr;

            if(strCount==2){
                System.out.println("=========最后得到的时间字符串："+str);
                if(pattern.matcher(str).lookingAt()){
                    setLiunxDate(str);
                }
                strCount=0;
                str = "";
            }
        }
    }

    private  void setLiunxDate(String date){
//        String d = "\\G202012023122845022";
        System.out.println(date);
        String time = date.replaceAll(" ","");
//        System.out.println("清理后的时间格式："+time);
        String year = time.substring(2,6);
        String month = time.substring(6,8);
        String day = time.substring(8,10);
//        System.out.println("年："+year);
//        System.out.println("月："+month);
//        System.out.println("日："+day);

        String hour = time.substring(11,13);
        String min = time.substring(13,15);
        String sec = time.substring(15,17);
//        System.out.println("分："+min);
//        System.out.println("时："+hour);
//        System.out.println("秒："+sec);

        String osName = System.getProperty("os.name").toLowerCase();
        System.out.println("osName:"+osName);
        String rq = year+"-"+month+"-"+day;
        String sj = hour+":"+min+":"+sec;
        System.out.println("日期："+rq);
        System.out.println("时间："+sj);

        try {
            System.out.println("shell脚本启动==========");
            //通过exec 来运行Linux shell脚本：在这个demo中 setDate.sh 是和 LinuxTimeSetter 在同一个文件夹中
            String[] command = new String[]{"sh","./date.sh",rq,sj};
            Process proc = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String text = null;
            //输出操作结果
            while ((text = br.readLine()) != null) {
                System.out.println("操作结果："+text);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }


    };



    // 字节数组转字符串
    private String printHexString(byte[] b) {

        StringBuffer sbf = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sbf.append(hex.toUpperCase() + " ");
        }
        return sbf.toString().trim();
    }

    /**
     * 16进制转换成为string类型字符串
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "UTF-8");
            new String();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

}
